package com.itheima.d1_inner.demo5;

import java.util.ArrayList;
import java.util.function.Consumer;

//目标：掌握匿名内部类作为参数传递的应用场景
public class Demo {
    public static void main(String[] args) {
        /**
             * 应用场景：当调用方法，方法形参是一个抽象类或者接口时，为了简化代码书写，可以直接传递匿名内部类对象
             *
         * 需求：分别使用不用匿名内部类和用匿名内部类的方式调用go方法，对比两种方式哪种更方便
         */


        ArrayList<String> list = new ArrayList<>();
        list.add("1");
        list.add("1");
        list.add("1");
        list.add("1");
        list.add("1");

        list.forEach(new Consumer<String>() {
            @Override
            public void accept(String s) {
                System.out.println(s);
            }
        });
        //1.使用传统方式
        //1.1 定义一个Swimming接口的实现类，完成实现类

        //1.2 创建实现类对象
        Boy boy = new Boy();

        //1.3 调用方法，传入实现类对象
        go(boy);

        //2.使用匿名内部类方式
        //2.1 定义匿名内部类并创建对象
//        Swimming girl = new Swimming() {
//            @Override
//            public void swim() {
//                System.out.println("女孩爱蛙泳！");
//            }
//        };

        //2.2 调用方法
        //go(girl);

        //2.3 上面两个步骤可以更加快捷，直接调用方法，在小括号中直接new
        go(new Swimming() {
            @Override
            public void swim() {
                System.out.println("女孩爱蛙泳");
            }
        });
    }

    public static void go(Swimming sw) {
        System.out.println("开始~~~");
        sw.swim();
        System.out.println("结束~~~");
    }
}
